<?php

session_start();
require_once '../model/Objeto.php';
require_once '../model/Localizacao.php';
require_once '../model/HistoricoMovimentacao.php';
require_once '../model/Classe.php';
require_once '../model/Material.php';
require_once '../model/Emprego.php';
require_once '../model/Origem.php';
require_once '../model/Estilo.php';
require_once '../model/Colecao.php';
require_once '../model/Titulo.php';
require_once '../model/Epoca.php';
require_once '../model/EspacoCultural.php';
require_once '../model/Aquisicao.php';
require_once '../model/FatoHistorico.php';
require_once '../model/Fabricante.php';
require_once '../model/Referenciado.php';
require_once '../model/Imagem.php';
require_once '../model/Assunto.php';
require_once '../model/Intervencao.php';
require_once '../model/Autor.php';
require_once '../model/Tecnica.php';
require_once '../model/EstadoObjeto.php';
require_once '../model/Listagem.php';
require_once '../model/ListagemFactory.php';

class ObjetoDLO {

    private static $objetoDLO;
    private $objetos;

    private function __construct() {

    }

    /**
     * @method ObjetoController getInstance() para obter uma única instância do controlador
     * @return ObjetoDLO
     */
    public static function getInstance() {
        if (!isset(self::$objetoDLO)) {
            if (!isset($_SESSION['objetoController'])) {
                $_SESSION['objetoController'] = serialize(new ObjetoDLO());
            }
            self::$objetoDLO = unserialize($_SESSION['objetoController']);
        }
        return self::$objetoDLO;
    }

    public function listar(&$tipoConsulta, array &$dados) {
        $listagem = ListagemFactory::getListagem($tipoConsulta);
        $result = $listagem->listar($dados);
        $resultado[] = array();
        for ($i = 0; $i < sizeof($result); $i++) {
            $row = array();
            $row['cod_interno'] = &$result[$i]->getCod_interno();
            $row['cod_registro'] = &$result[$i]->getCod_registro();
            $row['nome'] = &$result[$i]->getNome();
            $resultado[$i] = &$row;
            unset($row);
        }
        return $resultado;
    }

    public function cadastrar(&$cod_registro, &$numero_serie, &$marca, &$modelo, &$copia, &$bibliografia, &$etiqueta, &$cod_classe, &$cod_espaco) {
        $classe = &Classe::consultar($cod_classe);
        $espaco = &EspacoCultural::consultar($cod_espaco);
        $objeto = new Objeto($cod_registro, $numero_serie, $marca, $modelo, $copia, $bibliografia, $etiqueta, $classe, $espaco);
        $objeto->cadastrar();
        $this->objetos[$objeto->getCod_interno()] = &$objeto;
    }

    public function alterar(&$cod_interno, &$campo_id, &$campo_valor) {
        if (isset($this->objetos[$cod_interno])) {
            $objeto = &$this->objetos[$cod_interno];
        } else {
            $objeto = &Objeto::consultar($cod_interno);
            $this->objetos[$cod_interno] = &$objeto;
            $_SESSION['objetoController'] = serialize($this);
        }
        $objeto->alterarCampo($campo_id, $campo_valor);
    }

    public function excluir(&$cod_interno) {
        if (isset($this->objetos[$cod_interno])) {
            $objeto = &$this->objetos[$cod_interno];
        } else {
            $objeto = &Objeto::consultar($cod_interno);
            $this->objetos[$cod_interno] = &$objeto;
            $_SESSION['objetoController'] = serialize($this);
        }
        $objeto->excluir();
        unset($this->objetos[$cod_interno]);
        $_SESSION['objetoController'] = serialize($this);
    }
    
    public function consultar(&$cod_interno) {
        if (isset($this->objetos[$cod_interno])) {
            $objeto = &$this->objetos[$cod_interno];
        } else {
            $objeto = &Objeto::consultar($cod_interno);
            //rever
            $_SESSION['objetoController'] = serialize($this);
        }
    }

}
?>